package blbetter.netze;

import java.util.Arrays;
import java.util.Vector;

import blbetter.db.BLDataBase;
import blbetter.db.Spiel;
import blbetter.db.Tabelle;

public class BlBetterInputSitV3 implements BlBetterInputSit {

	private double[] input = new double[24];

	private boolean hasError = false;

	public BlBetterInputSitV3(Spiel spiel, int X, int Y, int Z, BLDataBase db) {
		// statistiken der letzten spiele erstellen
		int heimId = spiel.heimId;
		int gastId = spiel.gastId;
		int saisonId = spiel.saisonId;
		Vector<Spiel> letzteSpieleHeim = db.getLetzteNSpieleByTeam(heimId, X
				+ Y + Z, saisonId, spiel.spieltag);
		Vector<Spiel> letzteSpieleGast = db.getLetzteNSpieleByTeam(gastId, X
				+ Y + Z, saisonId, spiel.spieltag);
		if (letzteSpieleHeim.size() < X + Y + Z) {
			System.err
					.println("BlBetterInputSitV3() error letzteSpieleHeim - size: "
							+ letzteSpieleHeim.size());
			System.err.println("Spiel: " + spiel);
			System.err.println(letzteSpieleHeim);
			hasError = true;
			return;
		}
		if (letzteSpieleGast.size() < X + Y + Z) {
			System.err
					.println("BlBetterInputSitV3() error letzteSpieleGast - size: "
							+ letzteSpieleGast.size());
			System.err.println("Spiel: " + spiel);
			System.err.println(letzteSpieleGast);
			hasError = true;
			return;
		}
		Vector<Spiel> letzteXHeim = new Vector<Spiel>(letzteSpieleHeim.subList(
				0, X));
		Vector<Spiel> letzteXGast = new Vector<Spiel>(letzteSpieleGast.subList(
				0, X));
		Vector<Spiel> letzteYAbXHeim = new Vector<Spiel>(letzteSpieleHeim
				.subList(X, X + Y));
		Vector<Spiel> letzteYAbXGast = new Vector<Spiel>(letzteSpieleGast
				.subList(X, X + Y));
		Vector<Spiel> letzteZAbXYHeim = new Vector<Spiel>(letzteSpieleHeim
				.subList(X + Y, X + Y + Z));
		Vector<Spiel> letzteZAbXYGast = new Vector<Spiel>(letzteSpieleGast
				.subList(X + Y, X + Y + Z));

		int[] punkteToreHeimX = Util
				.getPkteUToreFromSpiele(heimId, letzteXHeim);
		int[] punkteToreGastX = Util
				.getPkteUToreFromSpiele(gastId, letzteXGast);
		int[] punkteToreHeimY = Util.getPkteUToreFromSpiele(heimId,
				letzteYAbXHeim);
		int[] punkteToreGastY = Util.getPkteUToreFromSpiele(gastId,
				letzteYAbXGast);
		int[] punkteToreHeimZ = Util.getPkteUToreFromSpiele(heimId,
				letzteZAbXYHeim);
		int[] punkteToreGastZ = Util.getPkteUToreFromSpiele(gastId,
				letzteZAbXYGast);

		// System.out.println("PktToreHeim: " +
		// Arrays.toString(punkteToreHeim));
		// System.out.println("PktToreGast: " +
		// Arrays.toString(punkteToreGast));

		double durchsPkteHeimX = (double) punkteToreHeimX[0] / (double) X;
		double durchsPkteGastX = (double) punkteToreGastX[0] / (double) X;

		double durchsPkteHeimY = (double) punkteToreHeimY[0] / (double) Y;
		double durchsPkteGastY = (double) punkteToreGastY[0] / (double) Y;

		double durchsPkteHeimZ = (double) punkteToreHeimZ[0] / (double) Z;
		double durchsPkteGastZ = (double) punkteToreGastZ[0] / (double) Z;

		double durchsGeschossHeimX = (double) punkteToreHeimX[1] / (double) X;
		double durchsGeschossGastX = (double) punkteToreGastX[1] / (double) X;
		double durchsGekriegtHeimX = (double) punkteToreHeimX[2] / (double) X;
		double durchsGekriegtGastX = (double) punkteToreGastX[2] / (double) X;

		double durchsGeschossHeimY = (double) punkteToreHeimY[1] / (double) Y;
		double durchsGeschossGastY = (double) punkteToreGastY[1] / (double) Y;
		double durchsGekriegtHeimY = (double) punkteToreHeimY[2] / (double) Y;
		double durchsGekriegtGastY = (double) punkteToreGastY[2] / (double) Y;

		double durchsGeschossHeimZ = (double) punkteToreHeimZ[1] / (double) Z;
		double durchsGeschossGastZ = (double) punkteToreGastZ[1] / (double) Z;
		double durchsGekriegtHeimZ = (double) punkteToreHeimZ[2] / (double) Z;
		double durchsGekriegtGastZ = (double) punkteToreGastZ[2] / (double) Z;

		Tabelle tabelle = new Tabelle(saisonId, spiel.spieltag, db);

		int platzHeim = tabelle.getPlatz(heimId);
		int platzGast = tabelle.getPlatz(gastId);

		// input setzen
		// pkte
		input[0] = durchsPkteHeimX / 3.;
		input[1] = durchsPkteGastX / 3.;
		input[2] = durchsPkteHeimY / 3.;
		input[3] = durchsPkteGastY / 3.;
		input[4] = durchsPkteHeimZ / 3.;
		input[5] = durchsPkteGastZ / 3.;
		// tore
		input[6] = durchsGeschossHeimX / 4.;
		input[7] = durchsGeschossGastX / 4.;
		input[8] = durchsGeschossHeimY / 4.;
		input[9] = durchsGeschossGastY / 4.;
		input[10] = durchsGeschossHeimZ / 4.;
		input[11] = durchsGeschossGastZ / 4.;
		// geg-tore
		input[12] = durchsGekriegtHeimX / 4.;
		input[13] = durchsGekriegtGastX / 4.;
		input[14] = durchsGekriegtHeimY / 4.;
		input[15] = durchsGekriegtGastY / 4.;
		input[16] = durchsGekriegtHeimZ / 4.;
		input[17] = durchsGekriegtGastZ / 4.;
		// spieltag (nur spieltage 19-34)
		double[] spieltagBin = Util.getAsBinaryArr(spiel.spieltag - 19, 4);
		input[18] = spieltagBin[0];
		input[19] = spieltagBin[1];
		input[20] = spieltagBin[2];
		input[21] = spieltagBin[3];
		// tabellenplaetze
		input[22] = ((double) platzHeim - 1.) / 17.;
		input[23] = ((double) platzGast - 1.) / 17.;
	}

	@Override
	public double[] getInput() {
		return input;
	}

	public String toString() {
		return Arrays.toString(input);
	}

	@Override
	public boolean hasError() {
		return hasError;
	}
}
